/**
 * 
 */
package ar.utn.frgp.banco.dao;

import java.math.BigDecimal;
import java.util.List;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.enums.OrigenMovimiento;
import ar.utn.frgp.banco.entity.enums.TipoCuenta;
import ar.utn.frgp.banco.exceptions.DataAccessException;
import ar.utn.frgp.banco.exceptions.PersonalisedException;

/**
 * @author gvolpe
 * @since 18/04/2012 15:01:36
 */
public interface CuentasDAO extends GenericDao  {

	//Alta Cuenta
	
	//Modificar Cuenta 
	
	//Modificar Saldo y Descubierto
	public void updateSaldos(Cuenta cuenta) throws DataAccessException;	
	
	//Modificar estado	
	
	public boolean existeCuenta(Cuenta cuenta)  throws PersonalisedException ;
	
	public boolean existeCuenta(Long idCuenta) throws PersonalisedException ;
	
	List<Cuenta> obtenerCuentas(String dni) throws PersonalisedException ;
	
	Cuenta obtenerCuenta (Long nroCuenta) throws DataAccessException ;
	
	Long crearCuenta(Cuenta cta,String dni)throws PersonalisedException ;
	
	/**
	 * Obtiene la cantidad de cuentas en base al tipo que sean.
	 * @param dni
	 * @param tipo El tipo de cuenta. Si es nulo devuelve 0;
	 * @return
	 * @throws PersonalisedException
	 */
	int cantidadCuentas(String dni, TipoCuenta tipo) throws PersonalisedException;
	
	/**
	 * devuelve el numero de cuentas corrientes.
	 * @param dni el dni del cliente.
	 * @return la cantidad de cuentas.
	 * @throws DataAccessException en caso de error.
	 */
	int cantidadCuentasCorrientes(String dni) throws DataAccessException;
	
	/**
	 * Registra una extracci�n
	 * @param idCuenta el id de la cuenta de donde se realiza la extraci�n
	 * @param saldo el saldo al momento de la extracci�n.
	 * @param monto la cantidad a extraer.
	 * @param origen el origen del movimiento.
	 * @throws DataAccessException
	 * @throws PersonalisedException
	 */
	void extraccion(Long idCuenta, BigDecimal monto, OrigenMovimiento origen) throws DataAccessException;
	
	/**
	 * 
	 * @param idCuenta
	 * @param monto
	 * @param origen
	 * @throws DataAccessException
	 * @throws PersonalisedException
	 */
	void deposito(Long idCuenta, BigDecimal monto, OrigenMovimiento origen) throws DataAccessException, PersonalisedException;
	
	/**
	 * Transfiere dinero entre dos cuentas.
	 * @param idCuentaOrigen la cuenta de orignen que CORRESPONDE AL CLIENTE.
	 * @param monto la cantidad a transferir.
	 * @param idCuentaDestino
	 * @throws DataAccessException
	 * @throws PersonalisedException
	 */
	void transferencia(Long idCuentaOrigen,BigDecimal monto, Long idCuentaDestino)throws DataAccessException, PersonalisedException;
	
}
